GitPythonでprivateなsubmoduleを取り込む 您所在的位置:网站首页 gitpython submodule GitPythonでprivateなsubmoduleを取り込む

GitPythonでprivateなsubmoduleを取り込む

#GitPythonでprivateなsubmoduleを取り込む| 来源: 网络整理| 查看: 265

やりたいこと いろいろな事情によりGitPythonを使って、他のリポジトリをcloneしたい そのリポジトリはprivateである さらに、そのリポジトリの中にprivateなsubmoduleが存在する

要はprivateにリポジトリだろうがなんだろうが

git clone [email protected]:hoge/fuga.git git submodule update --init

したいということ

やったこと とりあえず普通にcloneする

この段階ではまだsubmoduleは空の状態になる。

import git GITHUB_TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' REPO_OWNER = 'hoge' REPO_NAME = 'fuga' DIST_PATH = 'piyo' # リポジトリをcloneするときの名前 GIT_CLONE_URL = f'https://{GITHUB_TOKEN}@github.com/{REPO_OWNER}/{REPO_NAME}.git' # 単にmasterをcloneするだけのとき cloned_repo = git.Repo.clone_from( GIT_CLONE_URL, DIST_PATH) # branch指定、sshのhost key verification無視設定、 # commit履歴深さ設定などを追加するとこんなかんじ cloned_repo = git.Repo.clone_from( GIT_CLONE_URL, DIST_PATH env={'GIT_SSH_COMMAND': 'ssh -o "StrictHostKeyChecking=no"'}, branch='poyo', depth=1)

submoduleがpublicであれば、 clone_from()の引数に recursive=Trueを追加するだけでよい。

gitmoduleの上書き

submoduleのcloneは、具体的には .gitmodulesに記述されたurlが使われる。 昨今わざわざID/passでgitを利用する人間は稀だと思われるので、以下のように書かれていると思われる。

[submodule "poyo"] path = piyo url = [email protected]:hoge/fuga.git

つまり、このurlをtoken付きのhttpsに書き換えてあげることでsubmoduleを取得できるようになる。 clone_from()でrecursiveオプションを付与しないのは、.gitmodulesの書き換えより先に接続しようとしてしまい、権限不足でエラーが発生するためである。

単純にファイルを開いて置換処理を行い、そして保存すればよい。

# submoduleの取得に用いるURLを、sshからtoken付httpsに書き換える gitmodules_path = os.path.join(DIST_PATH, '.gitmodules') with open(gitmodules_path, 'r') as f: gitmodules = f.read() gitmodules = gitmodules.replace('[email protected]:', f'https://{GITHUB_TOKEN}@github.com/') with open(gitmodules_path, 'w') as f: f.write(gitmodules) git submodule update --initする

"gitpython submodule"でググるとわかるが、リリースされて10年くらいの間に実装が二転三転しており(しかも全部生きてるっぽい)、submodule周りの実装がなんか4つくらいある。

動作確認できてシンプルに実現できたやつを紹介しておく。

for submodule in cloned_repo.submodules: cloned_repo.git.submodule('init', submodule.name) cloned_repo.git.submodule('update', submodule.name)

うまくゆけばsubmoduleの中身が反映されているはず。

その他躓いたこと

公式のGitPythonリポジトリにはrequirementsとして下記のように書かれている(2021年2月5日現在)。 - Git (1.7.x or newer) - Python >= 3.4

ただし、実際のところgitコマンドがsshなど他にちょいちょい依存しているので、それらも忘れないようにインストールしなければならない。 特にGitPythonを使うケースというのはdockerコンテナ内などであることが多いと思うが、そういう環境だとapk add opensshしておくみたいな「基礎的すぎて思いも寄らない箇所」への依存でコケたりするので注意が必要(一敗)。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有